#include <iostream>
#include <pthread.h>
#include <string>
#include <unistd.h>
#include <signal.h>
void *func(void *msg)
{
    std::cout << "new thread id : " << pthread_self() << std::endl;
    sleep(1);
    return nullptr;
}
int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, func, nullptr);
    sleep(3);
    std::cout << "main thread id : " << pthread_self() << std::endl;
    pthread_join(tid, nullptr);
    return 0;
}

// void *func(void *msg)
// {
//     std::string name = static_cast<char *>(msg);
//     int cnt = 3;
//     while (cnt--)
//     {
//         std::cout << name << std::endl;
//         sleep(1);
//     }
//     pthread_exit((void *)"thread pthread_exit");
//     // return (void*)"thread return";
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, func, (void *)"thread-1");
//     pthread_detach(tid);
//     sleep(5);
//     char *ret = nullptr;
//     int n = pthread_join(tid, (void **)&ret);
//     if (n == 0)
//         std::cout << ret << std::endl;
//     else
//         std::cout << "thread detach" << std::endl;
//     return 0;
// }

// void* func(void* msg)
// {
//     std::string name = static_cast<char*>(msg);
//     int cnt = 3;
//     while(cnt--)
//     {
//         std::cout<<name<<std::endl;
//         sleep(1);
//     }
//     return (void*)"thread return";
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,func,(void*)"thread-1");
//     char* ret = nullptr;
//     pthread_join(tid, (void**)&ret);
//     std::cout<<ret<<std::endl;
//     return 0;
// }

// void *func(void *arg)
// {
//     std::string name = static_cast<char *>(arg);
//     int cnt = 3;
//     while (cnt--)
//     {
//         std::cout << name << std::endl;
//         sleep(1);
//     }
//     // 线程退出
//     pthread_exit((void *)"pthread_exit");
//     // // 线程调用pthread_cancel取消
//     // pthread_cancel(pthread_self());
//     // 函数return
//     return (void *)"return";
// }
// int main()
// {
//     pthread_t tid;
//     // 创建新线程
//     int n = pthread_create(&tid, nullptr, func, (void *)"thread1");
//     if (n != 0)
//     {
//         std::cerr << "pthread_create" << std::endl;
//         return -1;
//     }
//     sleep(1);
//     // main线程取消新线程
//     // pthread_cancel(tid);

//     // 线程等待
//     char *retmsg = nullptr;
//     pthread_join(tid, (void **)&retmsg);
//     std::cout<<retmsg<<std::endl;
//     return 0;
// }

// void handler(int signum)
// {
//     std::cout << "signum : " << signum << std::endl;
//     sleep(1);
//     kill(getpid(), 9);
// }
// int main()
// {
//     for (int i = 1; i < 32; i++)
//         signal(i, handler);
//     exit(1);
//     // pthread_t tid;
//     // int n = pthread_create(&tid, nullptr, func, (void *)"thread-1");
//     // // 创建线程执行func函数 , func函数的参数(void *)"trhead-1"
//     // if (n != 0)
//     // {
//     //     std::cerr << "pthread_create : " << std::endl;
//     //     return 1;
//     // }

//     return 0;
// }

// void *fun(void *rgs)
// {
//     std::string name = static_cast<char *>(rgs);
//     // int cnt = 10;
//     // while (cnt--)
//     // {
//     //     // std::cout << name << ",tid : " << pthread_self() << std::endl;
//     //     printf("%s, tid : %p\n", name.c_str(), pthread_self());
//     //     sleep(1);
//     // }
//     while(true)
//     {
//         printf("%s, tid : %p\n", name.c_str(), pthread_self());
//         //线程退出
//         //return (void*)"100";
//         pthread_exit((void*)"100");
//     }
//     return (void *)"thread-1 exit";
// }
// int main()
// {
//     // 创建线程
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, fun, (void *)"thread-1");

//     int cnt = 3;
//     while (cnt--)
//     {
//         // std::cout << "main thread : " << pthread_self() << std::endl;
//         printf("main thread : %p\n", pthread_self());
//         sleep(1);
//     }
//     // //取消线程
//     // pthread_cancel(tid);
//     //分离线程
//     pthread_detach(tid);
//     // 等待线程
//     char *ret = nullptr;
//     pthread_join(tid, (void **)&ret);
//     // std::cout << "ret msg : " << ret << std::endl;

//     sleep(10);
//     return 0;
// }